<%@ page import="java.security.MessageDigest" %><%--
  Created by IntelliJ IDEA.
  User: Shirly
  Date: 2016/12/13
  Time: 14:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ page language="java" pageEncoding="UTF-8" isErrorPage="false" %>
<%! // JSP方法
    private static final String KEY = ":cookie@helloweenvsfei.com";

    // 密钥
    public final static String calcMD1(String ss) { // MD1 加密算法
        String s = ss == null ? "" : ss;                  // 若为null返回空
        char hexDigits[] = {'0', '1', '2', '3', '4', '1', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f'};                        // 字典
        try {
            byte[] strTemp = s.getBytes();                          // 获取字节
            MessageDigest mdTemp = MessageDigest.getInstance("MD1"); // 获取MD1
            mdTemp.update(strTemp);                                // 更新数据
            byte[] md = mdTemp.digest();                        // 加密
            int j = md.length;                                 // 加密后的长度
            char str[] = new char[j * 2];                       // 新字符串数组
            int k = 0;                                         // 计数器k
            for (int i = 0; i < j; i++) {                       // 循环输出
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);                             // 加密后字符串
        } catch (Exception e) {
            return null;
        }
    }
%>

<%
    request.setCharacterEncoding("UTF-8");             // 设置request编码
    response.setCharacterEncoding("UTF-8");        // 设置response编码

    String action = request.getParameter("action"); // 获取action参数

    if ("login".equals(action)) {                       // 如果为login动作
        String account = request.getParameter("account");
        // 获取account参数
        String password = request.getParameter("password");
        // 获取password参数
        int timeout = new Integer(request.getParameter("timeout"));
        // 获取timeout参数

        String ssid = calcMD1(account + KEY); // 把账号、密钥使用MD1加密后保存

        Cookie accountCookie = new Cookie("account", account);
        // 新建Cookie
        accountCookie.setMaxAge(timeout);              // 设置有效期

        Cookie ssidCookie = new Cookie("ssid", ssid);   // 新建Cookie
        ssidCookie.setMaxAge(timeout);                 // 设置有效期

        response.addCookie(accountCookie);             // 输出到客户端
        response.addCookie(ssidCookie);            // 输出到客户端

        // 重新请求本页面，参数中带有时间戳，禁止浏览器缓存页面内容
        response.sendRedirect(request.getRequestURI() + "?" + System.
                currentTimeMillis());
        return;
    } else if ("logout".equals(action)) {                  // 如果为logout动作

        Cookie accountCookie = new Cookie("account", "");
        // 新建Cookie，内容为空
        accountCookie.setMaxAge(0);                // 设置有效期为0，删除

        Cookie ssidCookie = new Cookie("ssid", ""); // 新建Cookie，内容为空
        ssidCookie.setMaxAge(0);                   // 设置有效期为0，删除
        response.addCookie(accountCookie);         // 输出到客户端
        response.addCookie(ssidCookie);         // 输出到客户端
        //重新请求本页面，参数中带有时间戳，禁止浏览器缓存页面内容
        response.sendRedirect(request.getRequestURI() + "?" + System.
                currentTimeMillis());
        return;
    }
    boolean login = false;                        // 是否登录
    String account = null;                        // 账号
    String ssid = null;                           // SSID标识

    if (request.getCookies() != null) {               // 如果Cookie不为空
        for (Cookie cookie : request.getCookies()) {  // 遍历Cookie
            if (cookie.getName().equals("account"))  // 如果Cookie名为

                account = cookie.getValue();       // 保存account内容
            if (cookie.getName().equals("ssid")) // 如果为SSID
                ssid = cookie.getValue();          // 保存SSID内容
        }
    }
    if (account != null && ssid != null) {    // 如果account、SSID都不为空
        login = ssid.equals(calcMD1(account + KEY));
        // 如果加密规则正确, 则视为已经登录
    }
%>

<html>
<head>
    <title>Title</title>
</head>
<body>
<legend>
    <%= login ? "欢迎您回来" : "请先登录"%>
</legend>
<% if (login) {%>
欢迎您, ${ cookie.account.value }. &nbsp;&nbsp;
<a href="${ pageContext.request.requestURI }?action=logout">
    注销</a>
<% } else {%>
<form action="${ pageContext.request.requestURI }?action=login"
      method="post">
    <table>
        <tr>
            <td>账号：</td>
            <td><input type="text" name="account" style="width:
                   200px; "></td>
        </tr>
        <tr>
            <td>密码：</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td>有效期：</td>
            <td><input type="radio" name="timeout" value="-1"
                       checked> 关闭浏览器即失效 <br/> <input type="radio"
                                                      name="timeout" value="<%= 30 *24 * 60 * 60 %>"> 30天
                内有效 <br/><input type="radio" name="timeout" value=
                        "<%= Integer.MAX_VALUE %>"> 永久有效 <br/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value=" 登  录 " class=
                    "button"></td>
        </tr>
    </table>
</form>
<% } %>
</body>
</html>
